﻿using UnityEngine;
using System.Threading.Tasks;

public class SyncCallAsyncWithBlocking : MonoBehaviour
{
    
    private void Start()
    {
        Debug.Log("主线程开始"); // 不能打印,后续错误异步代码,瞬间阻塞卡住主线程
        // 在 Start 这个同步方法中调用异步方法
        CallAsyncMethodAndBlock();
        // 以下代码会在阻塞结束后执行
        Debug.Log("主线程阻塞结束，恢复正常");
    }

    private void CallAsyncMethodAndBlock()
    {
        // 启动一个异步任务
        Task task = Task.Run(async () =>
        {
            // 模拟一个 x 秒的异步操作 阻塞!
            await Task.Delay(4000);
            Debug.Log("异步任务完成");
            
            // 异步操作 不阻塞!
            // System.Threading.Thread.Sleep(4000);
            // Debug.Log("异步任务执行完成");
        });

        // 阻塞当前线程（也就是主线程），直到异步任务完成
        // task.Wait();
    }
    void Update()
    {
        Debug.Log("Update" );
    }
}

        
    // private void Start()
    // {
    //     CallAsyncMethodAndBlock();
        
    //     Debug.Log("主线程阻塞结束，恢复正常");
    // }

    // private void CallAsyncMethodAndBlock()
    // {
        
    //     Task task = Task.Run(async () =>
    //     {
            
    //         await Task.Delay(6000);
    //         Debug.Log("异步任务完成");
    //     });

        
    //     task.Wait();
    // }